package br.com.equus.bean;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import br.com.arquitetura.bean.BaseBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ComboUtil;
import br.com.arquitetura.util.ConstantesARQ;
import br.com.arquitetura.util.FacesMessagesUtil;
import br.com.equus.entidade.Animal;
import br.com.equus.entidade.AvaliacaoAnimal;
import br.com.equus.entidade.FuncaoAnimal;
import br.com.equus.entidade.GrauSangue;
import br.com.equus.entidade.MedicaoAnimal;
import br.com.equus.entidade.Pelagem;
import br.com.equus.entidade.Proprietario;
import br.com.equus.entidade.Raca;
import br.com.equus.entidade.Situacao;
import br.com.equus.entidade.TipoAnimal;
import br.com.equus.entidade.TipoCobertura;
import br.com.equus.entidade.TipoProprietario;
import br.com.equus.entidade.Usuario;
import br.com.equus.service.AnimalService;
import br.com.equus.service.UsuarioService;

@ManagedBean(name = "animalBean")
@ViewScoped
public class AnimalBean extends BaseBean<Animal> {

	
	private static final long serialVersionUID = 1L;

	private List<SelectItem> listaPelagem;
	private List<SelectItem> listaTipoAnimal;
	private List<SelectItem> listaRacas;
	private List<SelectItem> listaGrauSangue;
	private List<SelectItem> listaTipoCobertura;
	private List<SelectItem> listaFuncaoAnimal;

	private Integer idPelagem;
	private Integer idTipoAnimal;
	private Integer idRaca;
	private Integer idGrauSangue;
	private Integer idTpCobertura;
	private Integer idFuncaoAnimal;
	private MedicaoAnimal medicaoAnimal;
	private AvaliacaoAnimal avaliacaoAnimal;
	private Animal pai;
	private Animal mae;
	private Proprietario proprietario;
	private Proprietario proprietarioCriador;
	private boolean mostrarVoltar;
	private boolean femea;

	@ManagedProperty(value = "#{usuarioService}")
	protected UsuarioService usuarioService;
	@ManagedProperty(value = "#{animalService}")
	protected AnimalService animalService;

	public AnimalBean() {
		getModel().setPelagem(new Pelagem());
		getModel().setTipoAnimal(new TipoAnimal());
		getModel().setRaca(new Raca());
		getModel().setGrauSangue(new GrauSangue());
		getModel().setTipoCobertura(new TipoCobertura());
		medicaoAnimal = new MedicaoAnimal();
		avaliacaoAnimal = new AvaliacaoAnimal();
	}

	@Override
	public void verificarAcesso() {
		acessoBean.bloquearTela("ROLE_ANIMAL");
	}

	@SuppressWarnings("unchecked")
	@PostConstruct
	public void carregarListas() {
		try {

			Integer idAnimal = (Integer) getSessionMap().remove("idAnimal");
			if (idAnimal != null) {
				setModel((Animal) universalManager.get(Animal.class, idAnimal));
				load();
			}
			Boolean mostrarBtn = (Boolean) getSessionMap().remove(
					"mostrarVoltar");
			if (mostrarBtn != null && mostrarBtn) {
				mostrarVoltar = true;
			} else {
				mostrarVoltar = false;

			}
			Boolean save = (Boolean) getSessionMap().remove("saveAnimal");
			if (save != null && save) {
				FacesMessagesUtil
						.addInfoMessage(this.getQualifiedName(),
								this.getSaveMessage() + " "
										+ ConstantesARQ.COM_SUCESSO);
			}

			listaPelagem = ComboUtil.getItens(universalManager
					.listBy(new Pelagem(true)));
			Collections.sort(listaPelagem, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});
			listaFuncaoAnimal = ComboUtil.getItens(universalManager
					.listBy(new FuncaoAnimal(true)));
			Collections.sort(listaFuncaoAnimal, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});

			listaRacas = ComboUtil.getItens(universalManager.listBy(new Raca(
					true)));
			Collections.sort(listaRacas, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});

			listaGrauSangue = ComboUtil.getItens(universalManager
					.listBy(new GrauSangue(true)));
			Collections.sort(listaGrauSangue, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});

			listaTipoCobertura = ComboUtil.getItens(universalManager
					.listBy(new TipoCobertura(true)));
			Collections.sort(listaTipoCobertura, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	public void carregarListaTipoAnimal() {
		try {

			listaTipoAnimal = new ArrayList<SelectItem>();
			if (listaTipoAnimal.isEmpty()) {
				if (getModel().getSexo() != null
						&& getModel().getSexo().toString()
								.equalsIgnoreCase("M")) {
					listaTipoAnimal.add(new SelectItem(TipoAnimal.GARANHAO,
							((TipoAnimal) universalManager.get(
									TipoAnimal.class, TipoAnimal.GARANHAO))
									.getDescricao()));
				} else if (getModel().getSexo() != null
						&& getModel().getSexo().toString()
								.equalsIgnoreCase("F")) {
					listaTipoAnimal.add(new SelectItem(TipoAnimal.DOADOR,
							((TipoAnimal) universalManager.get(
									TipoAnimal.class, TipoAnimal.DOADOR))
									.getDescricao()));
					listaTipoAnimal.add(new SelectItem(TipoAnimal.MATRIZ,
							((TipoAnimal) universalManager.get(
									TipoAnimal.class, TipoAnimal.MATRIZ))
									.getDescricao()));
					listaTipoAnimal.add(new SelectItem(TipoAnimal.REPRODUTORA,
							((TipoAnimal) universalManager.get(
									TipoAnimal.class, TipoAnimal.REPRODUTORA))
									.getDescricao()));
				}
			}

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	public void filtroSexo() {
		try {
			if (getModel().getSexo().toString().equalsIgnoreCase("F")) {
				femea = true;
			} else {
				getModel().setQtdParto(null);
				femea = false;
			}

			carregarListaTipoAnimal();

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	@Override
	public String load() {
		super.load();
		filtroSexo();
		carregarListaTipoAnimal();
		if (getModel().getPelagem() != null) {
			idPelagem = getModel().getPelagem().getId();
		}
		if (getModel().getTipoAnimal() != null) {
			idTipoAnimal = getModel().getTipoAnimal().getId();
		}
		if (getModel().getRaca() != null) {
			idRaca = getModel().getRaca().getId();
		}
		if (getModel().getGrauSangue() != null) {
			idGrauSangue = getModel().getGrauSangue().getId();
		}
		if (getModel().getTipoCobertura() != null) {
			idTpCobertura = getModel().getTipoCobertura().getId();
		}
		if (getModel().getPai() != null) {
			pai = getModel().getPai();
		}
		if (getModel().getMae() != null) {
			mae = getModel().getMae();
		}
		if (getModel().getProprietario() != null) {
			proprietario = getModel().getProprietario();
		}
		if (getModel().getProprietarioCriador() != null) {
			proprietarioCriador = getModel().getProprietarioCriador();
		}

		if (getModel().getFuncaoAnimal() != null
				&& getModel().getFuncaoAnimal().getId() != null) {
			idFuncaoAnimal = getModel().getFuncaoAnimal().getId();
		}

		return SUCCESS;
	}

	@Override
	public String save() {
		try {

			if (proprietario != null && proprietario.getId() != null) {
				getModel().setProprietario(proprietario);
			} else {
				getModel().setProprietario(null);
			}

			if (getModel().getSexo().toString().equalsIgnoreCase("M")) {
				getModel().setQtdParto(null);
			}

			if (proprietarioCriador != null
					&& proprietarioCriador.getId() != null) {
				getModel().setProprietarioCriador(proprietarioCriador);
			} else {
				getModel().setProprietarioCriador(null);
			}

			if (pai != null && pai.getId() != null) {
				getModel().setPai(pai);
			} else {
				getModel().setPai(null);
			}

			if (mae != null && mae.getId() != null) {
				getModel().setMae(mae);
			} else {
				getModel().setMae(null);
			}

			if (idPelagem != null && !idPelagem.equals(0)) {
				getModel().setPelagem(new Pelagem(idPelagem));
			}
			if (idFuncaoAnimal != null && !idFuncaoAnimal.equals(0)) {
				getModel().setFuncaoAnimal(new FuncaoAnimal(idFuncaoAnimal));
			}

			if (idTipoAnimal != null && !idTipoAnimal.equals(0)) {
				getModel().setTipoAnimal(new TipoAnimal(idTipoAnimal));
			}
			if (idRaca != null && !idRaca.equals(0)) {
				getModel().setRaca(new Raca(idRaca));
			}
			if (idGrauSangue != null && !idGrauSangue.equals(0)) {
				getModel().setGrauSangue(new GrauSangue(idGrauSangue));
			}
			if (idTpCobertura != null && !idTpCobertura.equals(0)) {
				getModel().setTipoCobertura(new TipoCobertura(idTpCobertura));
			}

			if (!camposValidos()) {
				return ERROR;
			}

			// Coloca o codigo sempre em maisculo
			getModel().setCodigo(getModel().getCodigo().trim().toUpperCase());

			// Validar Codigo unique
			Animal animal = new Animal();
			getModel().setSituacao(Situacao.ATIVO);
			animal.setCodigo(getModel().getCodigo().trim());
			List<Animal> lista = universalManager.listBy(animal, false);
			if (lista != null && !lista.isEmpty()
					&& !lista.get(0).getId().equals(getModel().getId())) {
				FacesMessagesUtil.addErrorMessage("Código ", " Já cadastrado");
				return ERROR;
			}

			super.save();
			getSessionMap().put("saveAnimal", true);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return redirect("animal.jsf");

	}

	public boolean camposValidos() {
		if (getModel().getIdade() < 0) {
			FacesMessagesUtil.addErrorMessage("Idade ", "Inválida");
			return false;
		}

		if (getModel().getDtSaida() != null
				&& getModel().getDtSaida().before(getModel().getDtEntrada())) {
			FacesMessagesUtil.addErrorMessage("Data de Saída ",
					" Não pode ser anterior a data de entrada");
			return false;
		}

		return true;
	}

	@SuppressWarnings("unchecked")
	public List<Animal> completeAnimalPai(String query) {
		List<Animal> sugestoes = new ArrayList<Animal>();
		Animal a = new Animal();
		a.setNome(query);
		a.setSexo('M');
		try {
			sugestoes = this.universalManager.listBy(a, true);
			sugestoes.remove(getModel());
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	@SuppressWarnings("unchecked")
	public List<Animal> completeAnimalMae(String query) {
		List<Animal> sugestoes = new ArrayList<Animal>();
		Animal a = new Animal();
		a.setNome(query);
		a.setSexo('F');
		try {
			sugestoes = this.universalManager.listBy(a, true);
			sugestoes.remove(getModel());
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> completeUsuario(String query) {
		List<Usuario> sugestoes = new ArrayList<Usuario>();
		Usuario a = new Usuario();
		a.setNome(query);
		try {
			sugestoes = usuarioService.completeUsuarioAtivo(a);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	@SuppressWarnings("unchecked")
	public List<Proprietario> completeProprietario(String query) {
		List<Proprietario> sugestoes = new ArrayList<Proprietario>();
		Proprietario a = new Proprietario();
		a.setTipoProprietario(new TipoProprietario(
				TipoProprietario.PROPRIETARIO));
		a.setNome(query);
		try {
			sugestoes = this.animalService.carregaProprietario(query);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	public List<Proprietario> completeCriador(String query) {
		List<Proprietario> sugestoes = new ArrayList<Proprietario>();
		Proprietario a = new Proprietario();
		a.setTipoProprietario(new TipoProprietario(TipoProprietario.CRIADOR));
		a.setNome(query);
		try {
			sugestoes = this.universalManager.listBy(a, true);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	@Override
	public Animal createModel() {
		return new Animal();
	}

	@Override
	public String getQualifiedName() {
		return "Animal";
	}

	@Override
	public boolean isFeminino() {
		return false;
	}

	public List<SelectItem> getListaPelagem() {
		return listaPelagem;
	}

	public void setListaPelagem(List<SelectItem> listaPelagem) {
		this.listaPelagem = listaPelagem;
	}

	public List<SelectItem> getListaTipoAnimal() {
		return listaTipoAnimal;
	}

	public void setListaTipoAnimal(List<SelectItem> listaTipoAnimal) {
		this.listaTipoAnimal = listaTipoAnimal;
	}

	public List<SelectItem> getListaRacas() {
		return listaRacas;
	}

	public void setListaRacas(List<SelectItem> listaRacas) {
		this.listaRacas = listaRacas;
	}

	public List<SelectItem> getListaGrauSangue() {
		return listaGrauSangue;
	}

	public void setListaGrauSangue(List<SelectItem> listaGrauSangue) {
		this.listaGrauSangue = listaGrauSangue;
	}

	public List<SelectItem> getListaTipoCobertura() {
		return listaTipoCobertura;
	}

	public void setListaTipoCobertura(List<SelectItem> listaTipoCobertura) {
		this.listaTipoCobertura = listaTipoCobertura;
	}

	public Integer getIdPelagem() {
		return idPelagem;
	}

	public void setIdPelagem(Integer idPelagem) {
		this.idPelagem = idPelagem;
	}

	public Integer getIdTipoAnimal() {
		return idTipoAnimal;
	}

	public void setIdTipoAnimal(Integer idTipoAnimal) {
		this.idTipoAnimal = idTipoAnimal;
	}

	public Integer getIdRaca() {
		return idRaca;
	}

	public void setIdRaca(Integer idRaca) {
		this.idRaca = idRaca;
	}

	public Integer getIdGrauSangue() {
		return idGrauSangue;
	}

	public void setIdGrauSangue(Integer idGrauSangue) {
		this.idGrauSangue = idGrauSangue;
	}

	public Integer getIdTpCobertura() {
		return idTpCobertura;
	}

	public void setIdTpCobertura(Integer idTpCobertura) {
		this.idTpCobertura = idTpCobertura;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Animal getPai() {
		return pai;
	}

	public void setPai(Animal pai) {
		this.pai = pai;
	}

	public Animal getMae() {
		return mae;
	}

	public void setMae(Animal mae) {
		this.mae = mae;
	}

	public Proprietario getProprietario() {
		return proprietario;
	}

	public void setProprietario(Proprietario proprietario) {
		this.proprietario = proprietario;
	}

	public List<SelectItem> getListaFuncaoAnimal() {
		return listaFuncaoAnimal;
	}

	public void setListaFuncaoAnimal(List<SelectItem> listaFuncaoAnimal) {
		this.listaFuncaoAnimal = listaFuncaoAnimal;
	}

	public Integer getIdFuncaoAnimal() {
		return idFuncaoAnimal;
	}

	public void setIdFuncaoAnimal(Integer idFuncaoAnimal) {
		this.idFuncaoAnimal = idFuncaoAnimal;
	}

	public Proprietario getProprietarioCriador() {
		return proprietarioCriador;
	}

	public void setProprietarioCriador(Proprietario proprietarioCriador) {
		this.proprietarioCriador = proprietarioCriador;
	}

	public MedicaoAnimal getMedicaoAnimal() {
		return medicaoAnimal;
	}

	public void setMedicaoAnimal(MedicaoAnimal medicaoAnimal) {
		this.medicaoAnimal = medicaoAnimal;
	}

	public AvaliacaoAnimal getAvaliacaoAnimal() {
		return avaliacaoAnimal;
	}

	public void setAvaliacaoAnimal(AvaliacaoAnimal avaliacaoAnimal) {
		this.avaliacaoAnimal = avaliacaoAnimal;
	}

	public boolean isMostrarVoltar() {
		return mostrarVoltar;
	}

	public void setMostrarVoltar(boolean mostrarVoltar) {
		this.mostrarVoltar = mostrarVoltar;
	}

	public boolean isFemea() {
		return femea;
	}

	public void setFemea(boolean femea) {
		this.femea = femea;
	}

	public UsuarioService getUsuarioService() {
		return usuarioService;
	}

	public void setUsuarioService(UsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}
	public AnimalService getAnimalService() {
		return animalService;
	}

	public void setAnimalService(AnimalService animalService) {
		this.animalService = animalService;
	}

}
